<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript">
        // 原型prototype   
        /*
        * 1. 创建的每一个函数，解析器都会添加一个属性属性prototype
        * 2. prototype这个属性中的对象，便是原型对象
        * 3. 当函数以构造函数的形式调用时，他所创建的对象都会包含一个隐含属性，这个隐含属性指向这个原型对象，可以通过__proto__属性访问
        * 4. 原型对象中的属性和方法，可以被所有实例对象共享
        * 5. 原型对象中的属性和方法，不能被实例对象所覆盖
        * 6. 原型对象中的属性和方法，不能被实例对象所修改
        * 7. 原型对象就相当于一个公共区域，所有同一个类的实例都可以访问这块数据
        */
         function Person(name,age,gender){
            this.name = name;
            this.age = age;
            this.gender = gender;
         }

         var peter = new Person("Peter",18,"male");
         var josh = new  Person("Josh",29,"male");
         var joe = new  Person("Joe",18,"female");

         Person.prototype.sayName = function(){console.log(this.name);}

         Person.prototype.toString = function(){
            for(varName in this){
                console.log(varName+" = "+this[varName]);
            }
         }

         console.log(peter.hasOwnProperty("sayName"));
         console.log("-------------------");
         peter.sayName()
         josh.sayName()
         //console.log(josh);
         // 判断一个属性是否属于某个对象 使用in
         console.log("sayName" in josh);
         //判断对象自身是否含有该属性hasOwnProperty（是prototype的属性，还是实例对象的属性）
         //hasOwnProperty是原型对象的原型对象的方法
         console.log(josh.hasOwnProperty("sayName"));
         console.log(josh.hasOwnProperty("hasOwnProperty"));
         console.log(josh.__proto__.hasOwnProperty("hasOwnProperty"));
         console.log(josh.__proto__.__proto__.hasOwnProperty("hasOwnProperty"));
         console.log(josh.__proto__.__proto__.__proto__);

         var obj = new Object();
         //console.log(obj);
         console.log(obj.__proto__.toString());


    </script>
</head>
<body>
    
</body>
</html>